﻿// 麻省理工学院许可证
//
// 版权所有 (c) 2021-2023 zuohuaijun，大名科技（天津）有限公司  联系电话/微信：18020030720  QQ：515096995
//
// 特此免费授予获得本软件的任何人以处理本软件的权利，但须遵守以下条件：在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
//
// 软件按“原样”提供，不提供任何形式的明示或暗示的保证，包括但不限于对适销性、适用性和非侵权的保证。
// 在任何情况下，作者或版权持有人均不对任何索赔、损害或其他责任负责，无论是因合同、侵权或其他方式引起的，与软件或其使用或其他交易有关。

using Furion.Schedule;

using GnpFine.Core;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using SqlSugar.DistributedSystem.Snowflake;
using System.Collections.Generic;

namespace GnpFine.Application.NmpaSystem;

/// <summary>
/// 清理日志作业任务
/// </summary>
[JobDetail("InstrumentInvJob", Description = "器械库存", GroupName = "default", Concurrent = false)]
[PeriodHours(8,TriggerId = "trigger_InstrumentInvJob", Description = "器械库存", MaxNumberOfRuns = 5, RunOnStart=true,StartNow =true)]
public class InstrumentInvJob : IJob
{

    private readonly IServiceScopeFactory _scopeFactory;
    private readonly ISqlSugarClient _db;

    public InstrumentInvJob(IServiceScopeFactory scopeFactory, ISqlSugarClient db)
    {
        _scopeFactory = scopeFactory;
        _db=db;
    }

    public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken)
    {

        //Console.WriteLine("\n-----------器械库存更新--任务开始----------");

        Log.Information("\n-----------器械库存更新--任务开始----------");
        // 获取定时任务的参数
        //老的quartz获取参数方式
        //var requestParam = context.JobDetail.JobDataMap.GetString(SchedulerDef.REQUESTPARAMETERS)?.Trim();
        var requestParam = context.JobDetail.GetProperty("sqlwhere").ToString().Trim();
        //var requestParam = "bigClassNo  in ('SP015','SP016','SP017')";

        // 云星空从金蝶服务器获取数据
        ResponseModel<InstrumentStore> kDCusinvdata = KdCloudOpertionUtils.GetCusdata<InstrumentStore>("GnFine.Yaojian.WebAPI.ServicesStub.GetCustInstrumentInv.ExecuteService,GnFine.Yaojian.WebAPI.ServicesStub", requestParam);
        // 云星辰从金蝶服务器获取数据
        //ResponseModel<InstrumentStore> kDCusinvdata= new KdStartSdkUtil().GetKdInvData();

        var _childDb = _db.AsTenant().GetConnectionScopeWithAttr<InstrumentStore>();
        var a = _childDb.Ado.ExecuteCommand("delete  from [InstrumentStore] ");
        var b = _childDb.AsTenant().InsertableWithAttr(kDCusinvdata.data).ExecuteCommand();

        Log.Information($"器械库存更新--任务结束:数据获取{kDCusinvdata.rowcount}条,数据插入{b}条，删除{a}条\n");

        //之前的参考用
        //var a = sugarclient.Ado.ExecuteCommand("delete  from [InstrumentStore] ");
        //var i = sugarclient.Insertable(kDCusinvdata.data).ExecuteCommand();

        //---------------------------------------------------------------------------------------------------

        // // 一 、 使用仓储方法操作 药监数据库，根据表特性自动切库,此次使用 二 单例模式。
        // using var serviceScope = _scopeFactory.CreateScope();
        // var instrumentStoreRep = serviceScope.ServiceProvider.GetService<SqlSugarRepository<InstrumentStore>>();
        // // 删除数据使用单例方式，此处仅做演示，所以注解了
        // // await instrumentStoreRep.AsDeleteable().Where(u => u.BATCH_NO != "312").ExecuteCommandAsync(stoppingToken);                                                                                                         
        // //await instrumentStoreRep.AsDeleteable().Where(u => (DateTime)u.CreateTime < DateTime.Now.AddDays(-daysAgo)).ExecuteCommandAsync(stoppingToken); // 删除访问日志


        // // 二 、 单例模式操作药监数据库,获取主库,直接id获取子库
        // // ISugarClient使用多租户的解释：
        // // 问题：Db.GetConnection点不出来，出现这种情况一般是用的接口对象ISqlSugarClient
        // // 解决方案: Db.AsTenant().GetConnection(1)
        // // 原理如下：
        // // ISqlSugarClient和SqlSugarClient不同，ISqlSugarClient不包含租户方法

        // // 2.1 使用 APP 获取单例模式，根据ID获取子库， 使用注意获取的是ISqlSugarClient，看下面实现多库
        // var _db1 =App.GetService<ISqlSugarClient>();
        // var _db2=_db1.AsTenant().GetConnection(SqlSugarConst.MainConfigId);
        // //线程安全，子对象也支持了线程安全
        // var _db3 = _db1.AsTenant().GetConnectionScope(SqlSugarConst.MainConfigId);

        // // 2.2 使用 注入 获取单例模式，根据ID获取子库，注意注入的是ISqlSugarClient
        // var _db4 = _db.AsTenant().GetConnection(SqlSugarConst.MainConfigId);
        // //// 2.3 、 直接获取SqlSugarClient,这样子是失败的。看来不是接口不能注入，当时注测数据库服务也是用的接口，而且这个样不标准。
        // // var _db4 = App.GetService<SqlSugarClient>();
        // // var _db5 = _db4.GetConnection(SqlSugarConst.MainConfigId);


        // // 三 、 关于单例模式的切库，除了用上面获取子库id方式，还可以根据特性：
        // // 3.1 通过特性获取子库---- 表实体要贴 [TenantAttribute("2")]
        // var _childDb = _db.AsTenant().GetConnectionWithAttr<InstrumentStore>();
        // //线程安全方式
        // var _childDb1 = _db.AsTenant().GetConnectionScopeWithAttr<InstrumentStore>();

        //3.2 根据特性直接CRUD，最简洁。   因为3.1用表切库，很反人类思维，还不如id切库。
        //先切库也是有好处的，比如操作无实体类的上面那个删除。
        //var list = db.QueryableWithAttr<Order>().ToList();//5.0.9.1 全自动切换库查询
        //db.InsertWithAttr(list).ExecuteCommand();//5.0.9.1 全自动切换库插入
        //db.UpdateWithAttr(list).ExecuteCommand();//5.0.9.1 全自动切换库更新
        //db.DeleteableWithAttr(list).ExecuteCommand();//5.0.9.1 全自动切换库删除

        //---------------------------------------------------------------------------------------------------




    }
}
